/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.schedule;

import java.text.SimpleDateFormat;
import java.util.Locale;
import ade.main.R;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Défini la structure de la vue de la liste de cours d'un emploi du temps.
 * Chaque ligne affiche le nom du cours, l'heure du cours, et la salle.
 * @author Seb
 */
public class ListLessonAdapter extends BaseAdapter {

	private Lessons lessons;

	private LayoutInflater inflater;

	public final ArrayAdapter<String> headers; 
	public final static int TYPE_SECTION_HEADER = 1;  
	public final static int TYPE_ITEM = 0; 

        /**
         * Initialise l'adaptateur de la liste de cours.
         * @param context
         * @param lessons cours
         */
	public ListLessonAdapter(Context context, Lessons lessons) {
		inflater = LayoutInflater.from(context) ;
		this.createLessons(lessons) ;
		headers = new ArrayAdapter<String>(context, R.layout.list_header); 
	}

        /**
         * Gére l'affichage des date sous la forme : Jour n° Mois.
         * @param lessons 
         */
	private void createLessons(Lessons lessons) {
		this.lessons = new Lessons() ;
		this.lessons.ensureCapacity(lessons.size() * 2) ;
		String currentDate = null ;
		for(Lesson l : lessons) {
			String date = l.getTime() ;
			date = date.substring(0, date.indexOf(" ")) ;
			if (!date.equals(currentDate)) { //++d ;
				String formattedDate = new SimpleDateFormat("EEEE dd MMMM", Locale.FRANCE).format(l.getDate()) ;
				this.lessons.append(new DateSeparator(formattedDate)) ;
				currentDate = date ;
			}// if
			this.lessons.append(l) ;
		}// for
	}

	/**
         * Ajouter dans le header le nom de la catégorie et dans sections.
         * @param section le nom de la catégorie
         */
	public void addSection(String section) {  
		this.headers.add(section);
	} 

        /**
         * Retourne le type de l'élément à la position donnée.
         * @param position
         * @return Element ou Header
         */
	@Override
	public int getItemViewType(int position) {  
		Lesson l = this.lessons.get(position) ;
		if (l instanceof DateSeparator) 
			return TYPE_SECTION_HEADER;
		else
			return TYPE_ITEM;           
	}

        /**
         * Rend certain élément non-séléctionnable. (les headers)
         * @return faux
         */
	public boolean areAllItemsSelectable() {  
		return false;  
	}  

        /**
         * Rend certain élément non-cliquable. (les headers)
         * @return 
         */
	@Override
	public boolean areAllItemsEnabled() {
		return false;
	}

        /**
         * Rend les headers non séléctionnables.
         * @param position
         * @return vrai si l'élement est de type Item, faux si de type Header.
         */
	@Override
	public boolean isEnabled(int position) {  
		return (getItemViewType(position) != TYPE_SECTION_HEADER);  
	} 

        /**
         * Cette méthode permet de connaitre le nombre d'items présent dans la liste.
         * @return nombre d'items présent dans la liste
         */
	public int getCount() {
		return lessons.size();
	}

        /**
         * Permet de retourner un objet contenu dans la liste à l'indice passé en paramètre.
         * @param index
         * @return objet contenu dans la liste à l'indice index
         */
	public Object getItem(int index) {
		return this.lessons.get(index);
	}

        /**
         * Retourne l'id d'un élément dans la liste à l'indice passé en paramètre.
         * @param index
         * @return id d'un élément dans la liste à l'indice index
         */
	public long getItemId(int index) {
		return this.lessons.get(index).getLessonId();
	}

        /**
         * Retourne la vue d'une ligne de la liste (Nom du cours, heure, salle).
         * @param position index dans la liste de cours
         * @param convertView vue
         * @param parent Vue parente
         * @return vue d'une ligne de la liste
         */
	public View getView(int position, View convertView, ViewGroup parent){
		Lesson l = this.lessons.get(position) ;
                //on récupére les préférences de l'utilisateur
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent.getContext());
                boolean adewebColor = preferences.getBoolean("colorAdeweb", false);
                
		if (l instanceof DateSeparator) {
			//if (convertView == null) {
			convertView = inflater.inflate(R.layout.list_day_separator, null);
			//}// if

			String day = ((DateSeparator)l).getDay() ;
			TextView time = (TextView) convertView.findViewById(R.id.day);
			time.setText(day) ;

		} else {
			//if (convertView == null) {
			convertView = inflater.inflate(R.layout.lesson_view, null);
                        
                        if (adewebColor) {
                            //On fixe la couleur d'arriere plan l'item dans la liste
                            String color = l.getColor();
                            String[] colors = color.split(",");
                            int red = Integer.parseInt(colors[0]);
                            int green = Integer.parseInt(colors[1]);
                            int blue = Integer.parseInt(colors[2]);
                            convertView.setBackgroundColor(Color.rgb(red, green, blue));
                        }

			//}// if
			TextView time  = (TextView) convertView.findViewById(R.id.time);
			TextView title = (TextView) convertView.findViewById(R.id.title);
			TextView room  = (TextView) convertView.findViewById(R.id.room);
			title.setText(l.getTitle());                       
			time.setText(l.getTime().substring(l.getTime().indexOf(' ')+1));
			room.setText(l.getRoom()); 
                        
                        if(adewebColor) {
                             title.setTextColor(Color.BLACK);
                             time.setTextColor(Color.BLACK);
                             room.setTextColor(Color.BLACK);
                        }
                        
                        ImageView icon = (ImageView) convertView.findViewById(R.id.change) ;
                        if(l.getChange() == Lesson.BIG_CHANGE)
                            icon.setVisibility(ImageView.VISIBLE);
                        else
                            icon.setVisibility(ImageView.INVISIBLE);
		}// if

		return convertView;
	}

        /**
         * Met à jour la liste des cours.
         * @param lessons cours
         */
	public void setLesson(Lessons lessons) {
		this.createLessons(lessons) ;
		this.notifyDataSetChanged() ;
	}

}
